package com.wzh.project.utils;

import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.yaml.snakeyaml.Yaml;

import com.wzh.project.utils.traverse.TraverseUtil;

/**
 * 	配置文件加载工具类<br>
 * @author wzh
 *
 */
public class ConfigLoader{
	private static Logger logger = LogManager.getLogger(ConfigLoader.class);

	private static ConfigLoader instance = new ConfigLoader();

	public static ConfigLoader getInstance() {
		return instance;
	}

	/**
	 *   	对外提供加载文件工具类,因为有可能是一个很多重复的多级的文件（一般在xml中会出现这种情况）
	 * @param filename	绝对路径的文件名
	 * @return list		文件里面的属性
	 * @throws Exception
	 */
	public List<Map<String,Object>> loadFile(String filename) throws Exception {
		if(filename == null) {
			throw new Exception("请传入文件名");
		}
		File file = new File(filename);
		logger.debug("开始加载配置文件:" + file);
		List<Map<String,Object>> result=new ArrayList<>();
		if (file.exists()) {
			try {
				FileInputStream inputStream = new FileInputStream(file);
				switch (filename.substring(filename.lastIndexOf("."))) {
				case ".properties":
					//加载properties文件
					result=loadProperties(inputStream);
					break;
				case ".xml":
					//加载xml文件
					result=loadXml(inputStream);
					break;
				case ".yaml":
					//加载yaml文件
					result=loadYaml(inputStream);
					break;
				case ".sh":
					//加载sh文件
					break;
				}
			} catch (Exception e) {
				throw new Exception("加载配置文件异常！", e);
			}
		}else {
			throw new Exception("文件不存在");
		}
		return result;
	}
	
	/**
	 * 	加载.properties 配置文件 使用java原生的类进行解析
	 * @param inputStream
	 * @return
	 * @throws Exception
	 */
	private static List<Map<String,Object>> loadProperties(FileInputStream inputStream) throws Exception{
		Properties properties=new Properties();
		properties.load(inputStream);
		List<Map<String,Object>> result=new ArrayList<Map<String,Object>>();
		result.add((Map)properties);
		return result;
	}
	
	/**
	 * 	加载xml文件 使用dom4j进行解析
	 * @param inputStream
	 * @return
	 * @throws Exception
	 */
	private static List<Map<String,Object>> loadXml(FileInputStream inputStream) throws Exception{
		final SAXReader reader = new SAXReader();
		Document document = reader.read(inputStream);
		Element root = document.getRootElement();
		//获取到根节点名字
		String rootName=root.getName();
		//String path = root.getPath();//该元素位于的当前树路径
		//获取到根节点对应的标签值
		String textTrim = root.getTextTrim();
		//获取
		root.attributeCount();
		List<Element> elements = root.elements();
		for (int i = 0; i < elements.size(); i++) {
			Element element = elements.get(i);
			String name = element.getName();//获取该标签的名字
			String textTrim2 = element.getTextTrim();//获取该标签对应的标签值
			//解析该标签内部的属性和值
			element.attributeCount();
			Iterator<Attribute> attributeIterator = element.attributeIterator();
			while (attributeIterator.hasNext()) {
				Attribute attr = attributeIterator.next();
				System.out.println(attr.getName() + "=" + attr.getValue());
			}
			
		}
//		NodeList childNodes = root.getChildNodes();
//		//根节点可以不进行增加
//		//进行一个遍历循环
//		int length=root.getChildNodes().getLength();
//		for (int i = 1; i < length; i=i+2) {
//			Node item = childNodes.item(i);
//			String nodeName=item.getNodeName();
//			item.getOwnerDocument();
//			((Document)item).getElementsByTagName(nodeName)[0];
//			String nodeValue=item.getNodeValue();
//			System.out.println(nodeName+":"+nodeValue);
//			
//		}
//		
//		Node node = root.getFirstChild().getNextSibling();
//		node.getAttributes();
//		node.getLocalName();
//		node.getNamespaceURI();
//		node.getNodeName();//获取当前节点的标签内容
//		node.getNodeType();//节点类型
//		node.getNodeValue();//节点对应的值//但是没有获取到
//		node.getOwnerDocument();
//		Node nextSibling = node.getNextSibling();
//		root.getChildNodes().getLength();
//		root.getNextSibling();
//		//开始递归遍历
//		System.out.println(node);
		return null;
	}
	
	/**
	 * 递归解析该标签节点//一个标签存在的值的类型有几种？
	 *	// 1标签名字 2 标签的值 3 标签内部的属性 
	 *		4子标签  采用一个listMap 存储(如果存在相同的)，不存在的话使用map进行存储
	 * @param element
	 */
	private static void recursionElement(Element element) {
		//用于返回最后的结果
		Map<String,Object> result=new HashMap<String, Object>();
		String nodeName=element.getName();
		String nodeValu=element.getTextTrim();
		result.put("nodeName", nodeName);
		result.put("nodeValue", nodeValu);
		int attributeCount=element.attributeCount();
		Map<String,Object> attributeMap=new HashMap<String, Object>();
		Iterator<Attribute> attributeIterator = element.attributeIterator();
		while (attributeIterator.hasNext()) {
			Attribute attr = attributeIterator.next();
			attr.getName();
			attr.getValue();
		}
		
	}
	
	/**
	 * 	加载.yaml文件
	 * @param inputStream
	 * @return
	 * @throws Exception
	 */
	private static List<Map<String,Object>> loadYaml(FileInputStream inputStream) throws Exception{
		Yaml yaml = new Yaml();
		Set<Object> yamlSets = yaml.load(inputStream);
		for (Object obj : yamlSets) {
			//每一个对象内部都是一个map
			Map map=(Map)obj;
			//再进行遍历读取
		}
		return null;
	}
	
	public static void main(String[] args) throws Exception {
		String fileName="D:\\Users\\wzh\\eclipse-workspace\\AllTechnology\\resource\\redis.properties";
		logger.debug("开始加载properties文件");
		List<Map<String, Object>> loadFile = ConfigLoader.getInstance().loadFile(fileName);
		if (loadFile!=null&&loadFile.size()>0) {
			logger.debug("加载成功,内容为:");
			for (Map<String, Object> map : loadFile) {
				logger.debug(TraverseUtil.traverseMap(map));
			}
		}
		logger.debug("加载properties文件结束");
		logger.debug("开始加载xml文件");
		fileName="D:\\Users\\wzh\\test\\sword-esb-trunk\\config\\src\\main\\resources\\META-INF\\resources\\esb_config.xml";
		loadFile = ConfigLoader.getInstance().loadFile(fileName);
		if (loadFile!=null&&loadFile.size()>0) {
			logger.debug("加载成功,内容为:");
			for (Map<String, Object> map : loadFile) {
				logger.debug(TraverseUtil.traverseMap(map));
			}
		}	
		logger.debug("加载xml文件结束");
		logger.debug("开始加载yaml文件=====================");
		fileName="D:\\Users\\wzh\\test\\wzh-fwzx-devtest\\src\\main\\resources\\microservice.yaml";
		loadFile = ConfigLoader.getInstance().loadFile(fileName);
		if (loadFile!=null&&loadFile.size()>0) {
			logger.debug("加载成功,内容为:");
			for (Map<String, Object> map : loadFile) {
				logger.debug(TraverseUtil.traverseMap(map));
			}
		}	
		logger.debug("加载yaml文件结束");
	}

}